﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using SistemaDeBastanteodePoderes.Persistencia;
using SistemaDeBastanteodePoderes.Dominio;

namespace SistemaDeBastanteodePoderes.Pruebas.DAO
{
    [TestFixture]
    public class Test_H4_2_BastanteoDAO
    {
        ITipoIntervencionDAO tipoIntervencionDAO = null;
        IPoderDAO poderDAO = null;
        ITipoServicioDAO tipoServicioDAO = null;
        ITipoEmpresaDAO tipoEmpresaDAO = null;
        IClienteDAO clienteDAO = null;

        TipoIntervencion tipoIntervencion = null;
        Poder poder = null;
        TipoServicio tipoServicio = null;
        TipoEmpresa tipoEmpresa = null;
        Cliente cliente = null;

        IBastanteoDAO bastanteoDAO = null;
        Bastanteo     bastanteoCreado = null;

        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            tipoIntervencionDAO = new Persistencia.NH.TipoIntervencionDAO(); // NHibernate
            poderDAO = new Persistencia.NH.PoderDAO(); // NHibernate
            tipoServicioDAO = new Persistencia.NH.TipoServicioDAO(); //NHibernate
            bastanteoDAO = new Persistencia.NH.BastanteoDAO(); //NHibernate
            tipoEmpresaDAO = new Persistencia.NH.TipoEmpresaDAO(); //NHibernate
            clienteDAO = new Persistencia.NH.ClienteDAO(); //NHibernate
            foreach (Bastanteo bastanteo in bastanteoDAO.ListarTodos())
                bastanteoDAO.Eliminar(bastanteo);

            tipoIntervencion = tipoIntervencionDAO.Crear(new TipoIntervencion() { Intervencion = "A SOLA FIRMA" });
            tipoServicio = tipoServicioDAO.Crear(new TipoServicio() { Servicio = "ACTIVO"});
            poder = poderDAO.Crear(new Poder() { CodCorto = "POD01", NomPoder = "PODER 01", Servicio = tipoServicio });
            tipoEmpresa = tipoEmpresaDAO.Crear(new TipoEmpresa() { Abreviacion="EMF", Descripcion = "DESC EMF"});
            cliente = clienteDAO.Crear(new Cliente() { nroRUC = "9", razSocial = "RZ", tipEmpresa = tipoEmpresa, cntEmpleados = 10, fecIniOperaciones = DateTime.Now});
        }

        [Test]
        public void Test1_Crear()
        {
            // 1. Validar que ocurra un error al intentar crear un bastanteo con un dato nulo
            Bastanteo bastanteoACrear = new Bastanteo();
            bastanteoACrear.Grupo = "A";
            bastanteoACrear.Intervencion = tipoIntervencion;
            bastanteoACrear.GruCombinacion = " ";
            bastanteoACrear.ImpLimite = 15000;
            bastanteoACrear.FecVencimiento = DateTime.Now;
            bastanteoACrear.Empresa = cliente;
            bastanteoACrear.PoderAsignado = null;
            Assert.Catch<Exception>(delegate
            {
                bastanteoCreado = bastanteoDAO.Crear(bastanteoACrear);
            });

            // 2. Validar que se cree un bastanteo correctamente (sin error)
            bastanteoACrear.PoderAsignado = poder;
            Assert.DoesNotThrow(delegate
            {
                bastanteoCreado = bastanteoDAO.Crear(bastanteoACrear);
            });

            // 3. Validar que el bastanteo creado no sea nulo, tenga un código mayor a 0 y el poder sea el ingresado
            Assert.IsNotNull(bastanteoCreado);
            Assert.Greater(bastanteoCreado.Codigo, 0);
            Assert.AreEqual(bastanteoCreado.PoderAsignado.CodCorto , poder.CodCorto);
        }
        [Test]
        public void Test2_Obtener()
        {
            Bastanteo bastanteoObtenido = null;
            // 1. Validar que se retorne nulo al obtener un bastanteo inexistente
            Assert.DoesNotThrow(delegate
            {
                bastanteoObtenido = bastanteoDAO.Obtener(1000);
            });
            Assert.IsNull(bastanteoObtenido);
            // 2. Validar que se obtenga el bastanteo creado satisfactoriamente
            Assert.DoesNotThrow(delegate
            {
                bastanteoObtenido = bastanteoDAO.Obtener(bastanteoCreado.Codigo);
            });
            Assert.IsNotNull(bastanteoObtenido);

            // 3. Validar que el grupo obtenido sea el creado anteriormente
            Assert.AreEqual(bastanteoObtenido.Grupo, bastanteoCreado.Grupo);
        }
        [Test]
        public void Test3_Modificar()
        {
            Bastanteo bastanteoAModificar = bastanteoDAO.Obtener(bastanteoCreado.Codigo);
            bastanteoAModificar.Grupo = "Z";
            bastanteoAModificar.ImpLimite = 25000;
            bastanteoAModificar.PoderAsignado = null;
            Bastanteo bastanteoModificado = null;
            // 1. Validar que ocurrar un error al intentar modificar el bastanteo con un poder nulo
            Assert.Catch<Exception>(delegate
            {
                bastanteoModificado = bastanteoDAO.Modificar(bastanteoAModificar);
            });
            // 2. Validar que se modifique correctamente el bastanteo
            bastanteoAModificar.PoderAsignado = poder;
            Assert.DoesNotThrow(delegate
            {
                bastanteoModificado = bastanteoDAO.Modificar(bastanteoAModificar);
            });
            // 3. Validar que el bastanteo modificado no sea nulo, tenga el importe limite, grupo y poder indicados
            Assert.IsNotNull(bastanteoModificado);
            Assert.AreEqual(bastanteoAModificar.ImpLimite, bastanteoModificado.ImpLimite);
            Assert.AreEqual(bastanteoAModificar.Grupo, bastanteoModificado.Grupo);
            Assert.AreEqual(bastanteoAModificar.PoderAsignado.CodCorto, bastanteoModificado.PoderAsignado.CodCorto);
        }
        [Test]
        public void Test4_Eliminar()
        {
            Bastanteo bastanteoAEliminar = bastanteoDAO.Obtener(bastanteoCreado.Codigo);
            // 1. Validar que ocurre un error si se intenta eliminar un bastanteo nulo
            Assert.Catch<Exception>(delegate
            {
                bastanteoDAO.Eliminar(null);
            });
            // 2. Validar que se elimina correctamente el bastanteo creado
            Assert.DoesNotThrow(delegate
            {
                bastanteoDAO.Eliminar(bastanteoAEliminar);
            });
            // 3. Validar que luego de eliminado se retorne nulo al obtenerlo
            Bastanteo representanteEliminado = bastanteoDAO.Obtener(bastanteoCreado.Codigo);
            Assert.IsNull(representanteEliminado);

        }
        [Test]
        public void Test5_Listar()
        {
            bastanteoDAO.Crear(new Bastanteo() { Grupo = "B", PoderAsignado = poder, Intervencion = tipoIntervencion, GruCombinacion = "Y", ImpLimite = 199, FecVencimiento = DateTime.Now, Empresa = cliente});
            bastanteoDAO.Crear(new Bastanteo() { Grupo = "C", PoderAsignado = poder, Intervencion = tipoIntervencion, GruCombinacion = "X", ImpLimite = 299, FecVencimiento = DateTime.Now, Empresa = cliente });
            // 1. Validar que se listen los bastanteo existentes exitosamente
            ICollection<Bastanteo> bastanteosExistentes = null;
            Assert.DoesNotThrow(delegate
            {
                bastanteosExistentes = bastanteoDAO.ListarTodos();
            });
            // 2. Validar que se retornen al menos los 2 bastanteo creados previamente
            Assert.GreaterOrEqual(bastanteosExistentes.Count, 2);
            // 3. Validar que cada cliente obtenido tenga un grupo no nulo
            foreach (Bastanteo bastanteo in bastanteosExistentes)
                Assert.IsNotNull(bastanteo.Grupo);
        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            foreach (Bastanteo bastanteo in bastanteoDAO.ListarTodos())
                bastanteoDAO.Eliminar(bastanteo);

            tipoIntervencionDAO.Eliminar(tipoIntervencion);
            poderDAO.Eliminar(poder);
            tipoServicioDAO.Eliminar(tipoServicio);

            clienteDAO.Eliminar(cliente);
            tipoEmpresaDAO.Eliminar(tipoEmpresa);

            Persistencia.NH.NHibernateHelper.CerrarFabrica();
        }
    }
}